﻿using HK.Core.Common.Protocol;
using HK.Core.Common.Protocol.Data;
using HK.Core.Serializable.Data;
using HK.Core.Serializable.Protocol.Data;
using HK.Core.Settings.Data;

namespace HK.Core.Settings.Protocol
{

    /// <summary>
    /// 接口 : 加载缓存池大小设定数据
    /// </summary>
    public interface ILoadPoolSizeSettings : IJsonData
    {
        
        /// <summary>
        /// Ab数量
        /// </summary>
        int AbNum { get; }
        
        /// <summary>
        /// 文本资产数量
        /// <para>* 即 : TextAsset</para>
        /// </summary>
        int TextNum { get; }
        
        /// <summary>
        /// 可序列化对象缓存池数量
        /// </summary>
        int SObjectNum { get; }
        
        /// <summary>
        /// 预制体
        /// </summary>
        int PrefabNum { get; }
        
        /// <summary>
        /// Sprite数量
        /// </summary>
        int SpriteNum { get; }
        
        /// <summary>
        /// 图集数量
        /// </summary>
        int AtlasNum { get; }
        
        /// <summary>
        /// 纹理数量
        /// </summary>
        int TexNum { get; }
        
        /// <summary>
        /// 材质数量
        /// </summary>
        int MatNum { get; }
        
        /// <summary>
        /// Shader数量
        /// </summary>
        int ShaderNum { get; }
        
        /// <summary>
        /// 网格数量
        /// </summary>
        int MeshNum { get; }
    }
    
    /// <summary>
    /// 接口 : 游戏设定数据
    /// </summary>
    public interface IGameSettingsData : ISAssetData
    {
        /// <summary>
        /// 游戏名
        /// </summary>
        string GameName { get; }
        
        /// <summary>
        /// 打包Id
        /// </summary>
        string BuildId { get; }
        
        /// <summary>
        /// Debug标志位
        /// </summary>
        bool IsDebug { get; }
        
        /// <summary>
        /// 加密标志位
        /// </summary>
        bool Encryption { get; }

#region Pool

        /// <summary>
        /// 缓存池大小设定数据
        /// </summary>
        ILoadPoolSizeSettings LoadPoolSize { get; }

#endregion

#region Download

        /// <summary>
        /// 下载设定
        /// </summary>
        IDownloadSettingsData Download { get; }

        /// <summary>
        /// 下载完成标志位
        /// </summary>
        bool Downloaded { get; }

        /// <summary>
        /// 标记下载完成
        /// <para> * 下载完成，重置该标志位</para>
        /// </summary>
        void MarkAsDownloaded();

        /// <summary>
        /// 撤销标记 - 下载完成
        /// <para> * 重新开始下载前，重置该状态位</para>
        /// </summary>
        void UnMarkAsDownloaded();

#endregion

#region Servers

        /// <summary>
        /// 服务器列表
        /// </summary>
        IServersSettingsData Servers { get; }

#endregion

    }

    /// <summary>
    /// 接口 : 游戏设定
    /// </summary>
    /// <typeparam name="TData">游戏设定类型</typeparam>
    public interface IGameSettings<out TData> : ISAsset<TData>
        where TData : SAssetData, new()
    {
        /// <summary>
        /// 加密标志位
        /// </summary>
        bool Encryption { get; set; }
        
        /// <summary>
        /// 加载缓存池设定
        /// </summary>
        ILoadPoolSizeSettings LoadPoolSize { get; }
    }
    
}
